package co.yixiang.modules.order.cart.render.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import co.yixiang.common.enums.PromotionTypeEnum;
import co.yixiang.modules.adopt.entity.domain.YxAdoptProduct;
import co.yixiang.modules.adopt.service.YxAdoptProductService;
import co.yixiang.modules.goods.entity.domain.YxStoreProduct;
import co.yixiang.modules.goods.entity.enums.GoodsStatusEnum;
import co.yixiang.modules.goods.service.YxStoreProductService;
import co.yixiang.modules.member.service.YxUserService;
import co.yixiang.modules.order.cart.entity.dto.TradeDTO;
import co.yixiang.modules.order.cart.entity.enums.CartTypeEnum;
import co.yixiang.modules.order.cart.entity.enums.DeliveryMethodEnum;
import co.yixiang.modules.order.cart.entity.enums.RenderStepEnums;
import co.yixiang.modules.order.cart.entity.vo.CartSkuVO;
import co.yixiang.modules.order.cart.entity.vo.CartVO;
import co.yixiang.modules.order.cart.render.CartRenderStep;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 商品有效性校验
 *
 * @author Chopper
 * @since 2020-07-02 14:47
 */
@Service
@Slf4j
public class CheckDataRender implements CartRenderStep {

    @Autowired
    private YxStoreProductService goodsService;
    @Autowired
    private YxAdoptProductService adoptService;


    @Autowired
    private YxUserService userService;

    @Override
    public RenderStepEnums step() {
        return RenderStepEnums.CHECK_DATA;
    }

    @Override
    public void render(TradeDTO tradeDTO) {
        //校验商品有效性
        checkData(tradeDTO);
        //店铺分组数据初始化, 将商品放入购物车中
        groupStore(tradeDTO);
    }

    /**
     * 校验商品属性
     *
     * @param tradeDTO 购物车视图
     */
    private void checkData(TradeDTO tradeDTO) {
        //循环购物车中的商品
        for (CartSkuVO cartSkuVO : tradeDTO.getSkuList()) {

            //如果失效，确认sku为未选中状态
            if (Boolean.TRUE.equals(cartSkuVO.getInvalid())) {
                //设置购物车未选中
                cartSkuVO.setChecked(false);
            }
            //缓存中的商品信息
            YxStoreProduct dataSku = new YxStoreProduct();
            if (tradeDTO.getCartTypeEnum().name().equals(CartTypeEnum.ADOPT.name())) {
                final YxAdoptProduct goodsByIdFromCache = adoptService.getGoodsByIdFromCache(cartSkuVO.getGoodsSku().getId());
                BeanUtil.copyProperties(goodsByIdFromCache,dataSku);
            }else {
                dataSku = goodsService.getGoodsByIdFromCache(cartSkuVO.getGoodsSku().getId());
            }
            //商品有效性判定
            if (dataSku == null || dataSku.getCreateTime().after(cartSkuVO.getGoodsSku().getCreateTime())) {
                //设置购物车未选中
                cartSkuVO.setChecked(false);
                //设置购物车此sku商品已失效
                cartSkuVO.setInvalid(true);
                //设置失效消息
                cartSkuVO.setErrorMessage("商品信息发生变化,已失效");
                continue;
            }
            //商品上架状态判定
            if (!GoodsStatusEnum.UPPER.status().equals(dataSku.getIsShow())) {
                //设置购物车未选中
                cartSkuVO.setChecked(false);
                //设置购物车此sku商品已失效
                cartSkuVO.setInvalid(true);
                //设置失效消息
                cartSkuVO.setErrorMessage("商品已下架");
                continue;
            }
            //当前的用户是否是推广用户 &
            //代理商状态检查
            //商品库存判定 TODO:判断代理商库存
            if (dataSku.getStock() < cartSkuVO.getNum()) {
                //设置购物车未选中
                cartSkuVO.setChecked(false);
                //设置失效消息
                cartSkuVO.setErrorMessage("商品库存不足,现有库存数量[" + dataSku.getStock() + "]");
            }

        }
    }


    /**
     * 店铺分组
     *
     * @param tradeDTO
     */
    private void groupStore(TradeDTO tradeDTO) {
        //渲染的购物车
        List<CartVO> cartList = new ArrayList<>();

        //根据店铺分组
        Map<String, List<CartSkuVO>> storeCollect = tradeDTO.getSkuList().stream().collect(Collectors.groupingBy(CartSkuVO::getStoreId));
        for (Map.Entry<String, List<CartSkuVO>> storeCart : storeCollect.entrySet()) {
            if (!storeCart.getValue().isEmpty()) {
                CartVO cartVO = new CartVO(storeCart.getValue().get(0));
//                if (CharSequenceUtil.isEmpty(cartVO.getDeliveryMethod())) {
//                    cartVO.setDeliveryMethod(DeliveryMethodEnum.LOGISTICS.name());
//                }
//                if (ObjectUtil.isEmpty(cartVO.getShippingType())) {
//                    cartVO.setShippingType("1");
//                }
                cartVO.setSkuList(storeCart.getValue());
                storeCart.getValue().stream().filter(i -> Boolean.TRUE.equals(i.getChecked())).findFirst().ifPresent(cartSkuVO -> cartVO.setChecked(true));
                cartList.add(cartVO);
            }
        }
        tradeDTO.setCartList(cartList);
    }




}
